package com.wangshouyu.mp.system.token;

import com.google.common.collect.Maps;
import com.wangshouyu.mp.base.constant.UrlConstant;
import com.wangshouyu.mp.base.exception.MpException;
import com.wangshouyu.mp.base.request.MpClient;

import java.text.MessageFormat;
import java.util.Map;

import static com.wangshouyu.mp.base.request.HttpMethod.GET;

/**
 * @author 王守钰
 * @date 2020年08月16日 00:58
 * @description: 微信accessToken 工具类
 */
public abstract class AccessTokenHandler {

    protected static Map<Integer, String> codeMap = Maps.newConcurrentMap();

    static {
        codeMap.put(40164,"调用接口的IP地址不在白名单中，请在接口IP白名单中进行设置。（小程序及小游戏调用不要求IP地址在白名单内。）");
        codeMap.put(89503,"此IP调用需要管理员确认,请联系管理员");
        codeMap.put(89501,"此IP正在等待管理员确认,请联系管理员");
        codeMap.put(89506,"24小时内该IP被管理员拒绝调用两次，24小时内不可再使用该IP调用");
        codeMap.put(89507,"1小时内该IP被管理员拒绝调用一次，1小时内不可再使用该IP调用");
    }

    /**
     * 获取AccessToken
     * @param client 客户端
     * @param appId 公众号ID
     * @param secret 公众秘钥
     * @return
     */
    public static AccessToken accessToken(MpClient client, String appId, String secret){
        if(null == client) {
            throw new MpException("mpClient is empty");
        }
        synchronized (appId){
            String requestUrl = MessageFormat.format(UrlConstant.GET_ACCESS_TOKEN_URL, appId,secret);
            try {
                return client.request(GET, requestUrl, AccessToken.class);
            } catch (Exception e) {
                throw new AccessTokenException(e);
            }
        }
    }

}
